package com.fjwt.gz.util;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;

import java.util.regex.Pattern;

public class GeoValidator {
    // 经纬度格式正则（支持科学计数法和正负号）
    private static final Pattern GEO_PATTERN = Pattern.compile("^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$");
    private static final Pattern LNG_PATTERN = Pattern.compile("^[-+]?([1-9]?\\d|1[0-7]\\d)(\\.\\d+)?$");

    // 中国经纬度范围（粗略）
    private static final double MIN_LNG = 73.66;
    private static final double MAX_LNG = 135.05;
    private static final double MIN_LAT = 18.16;
    private static final double MAX_LAT = 53.55;

    /**
     * 校验经纬度格式有效性
     * @param lat 纬度
     * @param lng 经度
     * @return 是否有效
     */
    public static boolean isValidFormat(String lat, String lng) {
        if (!isNumeric(lat) || !isNumeric(lng)) return false;
        
        double latitude = Double.parseDouble(lat);
        double longitude = Double.parseDouble(lng);
        
        return latitude >= -90 && latitude <= 90 
            && longitude >= -180 && longitude <= 180;
    }

    /**
     * 校验是否在中国境内（粗略范围）
     * @param lat 纬度
     * @param lng 经度
     * @return 是否在中国境内
     */
    public static boolean isInChina(String lat, String lng) {
        if (!isValidFormat(lat, lng)) return false;
        
        double latitude = Double.parseDouble(lat);
        double longitude = Double.parseDouble(lng);
        
        return longitude >= MIN_LNG && longitude <= MAX_LNG
            && latitude >= MIN_LAT && latitude <= MAX_LAT;
    }

    /**
     * 判断是否为合法数字格式
     * @param str 输入字符串
     * @return 是否合法
     */
    private static boolean isNumeric(String str) {
        if (StrUtil.isBlank(str)) return false;
        return NumberUtil.isNumber(str);
    }
}
